package pwd.allen.importSelector;

import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

import java.util.ArrayList;

/**
 * 作用：根据运行时得条件来决定哪些配置类应该别导入，常被用来通过@EnableXXX注解来作为一个开关，简化客户端的配置负担
 * 需结合@Import使用
 *
 * 执行时机：在Beanfactory标准初始化之后，执行BeanFactory后置处理器的时候
 *  * {@link org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions(BeanDefinitionRegistry)}（实现了BeanDefinitionRegistryPostProcessor）的postProcessBeanDefinitionRegistry方法
 * -》processConfigBeanDefinitions
 *
 *
 * ImportSelector可以通过实现BeanClassLoaderAware、BeanFactoryAware、EnvironmentAware、ResourceLoaderAware来注入相应的bean，会在selectImports之前回调相应方法
 *
 * @author pwd
 * @create 2018-11-11 14:16
 **/
public class MyImportSelector implements ImportSelector {

    /**
     *
     * @param importingClassMetadata 当前标注@Import注解的类的所有注解信息
     * @return 方法不能返回null，否则报错【NullPointerException】
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // @Import所在的配置类
        System.out.println("配置类：" + importingClassMetadata.getClassName());
        // 打印读取的注解
        for (String annotationType : importingClassMetadata.getAnnotationTypes()) {
            System.out.println(String.format("注解【%s】的属性：%s", annotationType, JSONUtil.toJsonStr(importingClassMetadata.getAllAnnotationAttributes(annotationType))));
        }
        ArrayList<String> classes = new ArrayList<>();
        classes.add("pwd.allen.importBeanDefinitionRegistrar.MyImportBeanDefinitionRegistrar");
        return classes.toArray(new String[classes.size()]);
    }
}
